جزوه · چالش‌های فصل اول: فرمان tr بازگشت به فهرست
📘 چالش‌های فصل اول فرمان tr (Translate/Replace)
📅 تاریخ: ۱۹ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian

▍ مقدمه

فرمان tr مخفف Translate است و برای جایگزینی، حذف یا فشرده‌سازی کاراکترها در ورودی استفاده می‌شود. این فرمان خط به خط عمل نمی‌کند، بلکه کل ورودی را به عنوان یک جریان داده (Stream) پردازش می‌کند.

🔑 مفهوم اصلی:

tr ورودی را از STDIN می‌خواند و خروجی را به STDOUT می‌فرستد. معمولاً با Pipe یا Redirection استفاده می‌شود.

▍ ساختار کلی

tr [options] set1 [set2]

توضیح: کاراکترهای موجود در set1 را با کاراکترهای موجود در set2 جایگزین می‌کند.

▍ مثال‌های عملی (بر اساس عکس)

• مشاهده محتوای فایل

┌──(ya3in㉿kali)-[~/test] └─$ cat mohammad root:x:0:0:root:/root:/bin/bash

توضیح: محتوای فایل mohammad را نمایش می‌دهد (یک خط از فایل /etc/passwd).

• جایگزینی کاراکترها با tr

┌──(ya3in㉿kali)-[~/test] └─$ tr ":" "." < mohammad root.x.0.0.root./root./bin/bash

توضیح: همه کاراکترهای : را با . جایگزین می‌کند.

• ذخیره خروجی در فایل

┌──(ya3in㉿kali)-[~/test] └─$ tr ":" "." < mohammad > mohammad2 └─$ cat mohammad2 root.x.0.0.root./root./bin/bash

توضیح: خروجی tr را در فایل mohammad2 ذخیره می‌کند.

▍ گزینه‌های مهم tr

گزینه توضیح مثال
-d حذف کاراکترهای مشخص‌شده tr -d ':' < file
-s فشرده‌سازی (چندین کاراکتر تکراری را به یک کاراکتر تبدیل می‌کند) tr -s ' ' < file
-c مکمل (همه کاراکترها به جز مجموعه‌ی مشخص‌شده) tr -cd 'a-z' < file
-t کوتاه‌سازی (set1 را به اندازه set2 کوتاه می‌کند) tr -t 'abc' '12' < file

▍ مثال‌های کاربردی

• حذف کاراکترها با -d

┌──(ya3in㉿kali)-[~] └─$ echo "Hello 123 World" | tr -d '0-9' Hello World

توضیح: همه اعداد (۰ تا ۹) را حذف می‌کند.

• تبدیل حروف کوچک به بزرگ

┌──(ya3in㉿kali)-[~] └─$ echo "linux is great" | tr 'a-z' 'A-Z' LINUX IS GREAT

توضیح: همه حروف کوچک را به بزرگ تبدیل می‌کند.

• فشرده‌سازی فاصله‌ها با -s

┌──(ya3in㉿kali)-[~] └─$ echo "Hello World" | tr -s ' ' ' ' Hello World

توضیح: چندین فاصله را به یک فاصله تبدیل می‌کند.

• تبدیل خط جدید به فاصله

┌──(ya3in㉿kali)-[~] └─$ cat file.txt | tr '\n' ' '

توضیح: همه خطوط را به یک خط تبدیل می‌کند (خط جدید را با فاصله جایگزین می‌کند).

⚠️ چالش رایج:

اگر set1 و set2 طول متفاوتی داشته باشند، tr از آخرین کاراکتر set2 برای مابقی کاراکترهای set1 استفاده می‌کند. برای مثال:

echo "abc" | tr 'abc' '12' 122

توضیح: 'a' → '1'، 'b' → '2'، 'c' → '2' (آخرین کاراکتر set2)

▍ ترکیب با سایر دستورات

┌──(ya3in㉿kali)-[~] └─$ ifconfig | tr -s ' ' | grep "inet "

توضیح: فاصله‌های اضافی خروجی ifconfig را فشرده می‌کند و سپس خطوط حاوی inet را نمایش می‌دهد.

┌──(ya3in㉿kali)-[~] └─$ cat /etc/passwd | tr ':' ' ' | awk '{print $1}'

توضیح: فایل /etc/passwd را می‌خواند، : را به فاصله تبدیل می‌کند و سپس اولین فیلد (نام کاربر) را با awk استخراج می‌کند.

▍ جدول خلاصه

دستور کاربرد
tr 'a' 'b' < file جایگزینی 'a' با 'b' در فایل
tr 'a-z' 'A-Z' < file تبدیل حروف کوچک به بزرگ
tr -d ':' < file حذف کاراکتر ':'
tr -s ' ' < file فشرده‌سازی فاصله‌های تکراری
tr '\n' ' ' < file تبدیل خط جدید به فاصله
tr -cd 'a-zA-Z' < file فقط حروف انگلیسی را نگه می‌دارد
✅ تمرین پیشنهادی:
  • یک فایل متنی بسازید و با tr همه 'a' را به 'b' تبدیل کنید.
  • همه اعداد یک فایل را با tr -d حذف کنید.
  • با tr 'a-z' 'A-Z' یک متن را به حروف بزرگ تبدیل کنید.
  • با tr -s ' ' فاصله‌های اضافی یک فایل را فشرده کنید.
  • خروجی ifconfig را با tr پردازش کنید تا فقط آی‌پی IPv4 را استخراج کنید.